package com.xssq.utils.webSocket;

import cn.hutool.json.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.websocket.Session;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 网络套接字跑龙套
 *
 * @author xssq
 * @version 1.0.0
 * @date 2023/08/27 07:18:57
 * @saying 你可以不会但你必须得知道
 */
@Service
@Slf4j
public class WebSocketServiceImpl implements WebSocketService{
    /**
     * 连接建立成功
     *
     * @param sessionMap 会话映射
     * @param session    会话
     * @param id         id
     */
    @Override
    public void onOpen(Map<String, Session> sessionMap, Session session, String id) {
        sessionMap.put(id, session);
        JSONObject message = new JSONObject();
        message.set("cmd", 1);
        message.set("message", "连接成功");
        sendMessage(session, message.toString());
        log.info("连接成功: {}",id);
    }
    /**
     * 接收消息
     *
     * @param session    会话
     * @param message    消息
     * @param sessionMap 会话映射
     */
    @Override
    public void onMessage(Map<String, Session> sessionMap,Session session, String message) {
        ArrayList<Session> sessions = new ArrayList<>();
        sessionMap.forEach((s, session1) -> sessions.add(session1));
        sendMessageList(sessions, message);
        sendMessage(session,message);
    }

    /**
     * 连接关闭
     *
     * @param sessionMap 会话映射
     * @param session    会话
     */
    @Override
    public void onClose(Map<String, Session> sessionMap,Session session) {
        ArrayList<String> strings = new ArrayList<>();
        sessionMap.forEach((s, session1) -> {
            if (session.equals(session1)) {
                strings.add(s);
                sessionMap.remove(s);
            }
        });
        log.info("已经移除用户: {}",strings.get(0));
    }


    /**
     * 连接失败
     *
     * @param sessionMap 会话映射
     * @param session    会话
     * @param error      错误
     */
    @Override
    public void onError(Map<String, Session> sessionMap, Session session, Throwable error) {
        sessionMap.forEach((s, session1) -> {
            if (session.equals(session1)) {
                log.error("用户: {},连接失败",s);
            }
        });
    }

    /**
     * 发给session消息
     *
     * @param session 会话
     * @param message 消息
     */
    public static void sendMessage(Session session, String message) {
        try {
            session.getBasicRemote().sendText(message);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 群发送消息列表
     *
     * @param message     消息
     * @param sessionList 会话列表
     */
    public void sendMessageList(List<Session> sessionList, String message) {
        sessionList.forEach(session -> {
            try {
                session.getBasicRemote().sendText(message);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });
    }
}
